package com.github.codemperor.core.message.dingtalk.robot;

import com.alibaba.fastjson.JSONObject;
import com.github.codemperor.core.message.dingtalk.robot.bean.MarkdownMsgRequest;
import com.github.codemperor.core.message.dingtalk.robot.bean.RobotTextMsgRequest;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;

/**
 * 后期尽量别用这个类了
 */
@Deprecated
public class RobotMsgSend {
    private static Logger log = LoggerFactory.getLogger(RobotMsgSend.class);
    private static final String secret = "";
    private static String dingtalkRobotUrl = "";

    private static String getRobotUrl() {
        try {
            long timestamp = System.currentTimeMillis();
            String stringToSign = timestamp + "\n" + secret;
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            String signature = URLEncoder.encode(new String(Base64.encodeBase64(signData)), "UTF-8");
            return dingtalkRobotUrl + "&timestamp=" + timestamp + "&sign=" + signature;
        } catch (Exception e) {
            log.error("", e);
            return null;
        }
    }

    /**
     * 发送钉钉机器人普通文本消息
     *
     * @param title   文本标题，可以不填写
     * @param content 文本内容，如果换行，使用\r\n切分即可
     * @param isAtAll 是否at所有人，默认否
     */
    public static Object sendDingtalkRobotTextMsg(String title, String content, boolean isAtAll) {
        try {
            RobotTextMsgRequest.At at = new RobotTextMsgRequest.At();
            at.setAtAll(isAtAll);
            RobotTextMsgRequest.Text text = new RobotTextMsgRequest.Text();
            content = StringUtils.isEmpty(title) ? content : title + "\r\n" + content;
            text.setContent(content);
            RobotTextMsgRequest request = new RobotTextMsgRequest();
            request.setAt(at);
            request.setText(text);
            request.setMsgtype("text");

            RestTemplate restTemplate = new RestTemplate();
            log.info("[sendDingtalkRobotTextMsg] request: {}", request);
            Object object = restTemplate.postForEntity(dingtalkRobotUrl, request, Object.class);
            log.info("[sendDingtalkRobotTextMsg] res: {}", JSONObject.toJSONString(object));
            return object;
        } catch (Exception e) {
            log.error("", e);
            return null;
        }
    }

    /**
     * 发送钉钉机器人markdown消息
     *
     * @param title      文本标题，可以不填写
     * @param rowContent 每一行的发送内容，支持markdown语法，参考https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
     * @param isAtAll    是否at所有人，默认否
     * @param mobs    需要at的人的手机
     */
    public static Object sendDingtalkRobotMarkdownMsg(String title, List<String> rowContent, boolean isAtAll, String... mobs) {
        try {
            RobotTextMsgRequest.At at = new RobotTextMsgRequest.At();
            at.setAtAll(isAtAll);
            if (null != mobs && mobs.length > 0) {
                at.setAtMobiles(Arrays.asList(mobs));
            }

            MarkdownMsgRequest.Markdown markdown = new MarkdownMsgRequest.Markdown();
            markdown.setTitle(title);
            markdown.setText(String.join("\n\r", rowContent));

            MarkdownMsgRequest request = new MarkdownMsgRequest();
            request.setAt(at);
            request.setMarkdown(markdown);
            request.setMsgtype("markdown");

            RestTemplate restTemplate = new RestTemplate();

            log.info("[sendDingtalkRobotMarkdownMsg] request: {}", request);
            Object object = restTemplate.postForEntity(dingtalkRobotUrl, request, Object.class);
            log.info("[sendDingtalkRobotMarkdownMsg] res: {}", JSONObject.toJSONString(object));
            return object;
        } catch (Exception e) {
            log.error("", e);
            return null;
        }

    }


    public static void main(String[] args) {
        // robot.sendDingtalkRobotTextMsg("测试title", "第一行\r\n第二行", false);

        List<String> testMarkdown = Arrays.asList(
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "> 9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%9度，西北风1级，空气良89，相对温度73%",
                "无引用的文本",
                "无引用的文本",
                "无引用的文本",
                "无引用的文本",
                "1.列表1",
                "2.列表1",
                "3.列表1",
                "3.列表1",
                "![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)",
                "**加粗**",
                "*斜体*"
        );
        RobotMsgSend.sendDingtalkRobotMarkdownMsg("测试markdown", testMarkdown, false);
    }
}
